package com.zwj.interview.动态规划;

/**
 * @Author: Zwj
 * @Date: 2022/2/25 16:48
 *
 * 给你一个字符串 s ，找出其中最长的回文子序列，并返回该序列的长度。
 *
 * 子序列定义为：不改变剩余字符顺序的情况下，删除某些字符或者不删除任何字符形成的一个序列。
 * 输入：s = "bbbab"
 * 输出：4
 * 解释：一个可能的最长回文子序列为 "bbbb" 。
 */
public class 最长回文子系列 {

    //dp[i][j]表示字符串s的子系列s[i..j]中最长回文子串的长度，题目要求的就是dp[0][n-1]
    public int longestPalindromeSubseq(String s) {
         int n=s.length();
         int[][] dp=new int[n][n];
         for(int i=0;i<n;i++){
             dp[i][i]=1;
         }
         for(int i=n-2;i>=0;i--){
             for(int j=i+1;j<n;j++){
                 //如果说s[i]==s[j]的话，那么直接看前面的加上这两个字符
                 if(s.charAt(i)==s.charAt(j)){
                     dp[i][j]=dp[i+1][j-1]+2;
                 }else{
                     //不相等的话，缩小i或者j的值，取他们的最大者
                     dp[i][j]=Math.max(dp[i+1][j],dp[i][j-1]);
                 }
             }
         }
         return dp[0][n-1];
    }



}